package com.yulongtian.oneProblemEveryDay.month202302;

import java.util.*;

/**
 * https://leetcode.cn/problems/alert-using-same-key-card-three-or-more-times-in-a-one-hour-period/
 * 可
 *
 * @author yulongTian
 * @create 2023-02-07 10:44
 */
public class Test05 {
    public static void main(String[] args) {
        String[] keyName = {"leslie", "leslie", "leslie", "clare", "clare", "clare", "clare"};
        String[] keyTime = {"13:00", "13:20", "14:00", "18:00", "18:51", "19:30", "19:49"};
//        System.out.println(alertNames(keyName, keyTime));
    }


    //参考他人  哈希/排序/滑窗
    public List<String> alertNames(String[] keyName, String[] keyTime) {
        // 哈希表记录每个人名及其时间集合
        HashMap<String, List<String>> map = new HashMap<>();
        int n = keyName.length;
        for (int i = 0; i < n; i++) {
            List<String> timeList = map.getOrDefault(keyName[i], new LinkedList<>());
            timeList.add(keyTime[i]);
            map.put(keyName[i], timeList);
        }
        List<String> ans = new LinkedList<>();
        for (Map.Entry<String, List<String>> entry : map.entrySet()) {
            String name = entry.getKey();
            List<String> timeList = entry.getValue();
            // 时间排序
            timeList.sort((o1, o2) -> o1.compareTo(o2));
            // 滑动窗口思想，维护一个大小为 3 的窗口 即[i-2, ..., i]
            for (int i = 2; i < timeList.size(); i++) {
                Long t1 = convertTimeToLong(timeList.get(i));
                long t2 = convertTimeToLong(timeList.get(i - 2));
                if (t1 - t2 <= 60) {
                    ans.add(name);
                    break;
                }
            }
        }
        // 名称排序
        ans.sort((o1, o2) -> o1.compareTo(o2));
        return ans;
    }

    public Long convertTimeToLong(String time) {
        String[] t = time.split(":");
        return Long.parseLong(t[0]) * 60 + Long.parseLong(t[1]);
    }


//    //不可，错认为只能整点算一个小时
//    public static List<String> alertNames(String[] keyName, String[] keyTime) {
//        List<String> ans = new ArrayList<>();
//        HashMap<Integer, HashMap<String, Integer>> map = new HashMap<>();
//        for (int i = 0; i < keyTime.length; i++) {
//            String[] split = keyTime[i].split(":");
//            //小时
//            int hour = Integer.valueOf(split[0]);
//            //分钟
//            String minute = split[1];
//            if (!map.containsKey(hour)) {
//                HashMap<String, Integer> temp = new HashMap<>();
//                temp.put(keyName[i], 1);
//                map.put(hour, temp);
//            } else {
//                HashMap<String, Integer> temp = map.get(hour);
//                if (!temp.containsKey(keyName[i])) {
//                    temp.put(keyName[i], 1);
//                } else {
//                    temp.put(keyName[i], temp.get(keyName[i]) + 1);
//                }
//            }
//            if (minute.equals("00") && hour != 0) {
//                hour -= 1;
//                if (!map.containsKey(hour)) {
//                    HashMap<String, Integer> temp = new HashMap<>();
//                    temp.put(keyName[i], 1);
//                    map.put(hour, temp);
//                } else {
//                    HashMap<String, Integer> temp = map.get(hour);
//                    if (!temp.containsKey(keyName[i])) {
//                        temp.put(keyName[i], 1);
//                    } else {
//                        temp.put(keyName[i], temp.get(keyName[i]) + 1);
//                    }
//                }
//            }
//        }
//
//        for (Integer integer : map.keySet()) {
//            HashMap<String, Integer> temp = map.get(integer);
//            for (String s : temp.keySet()) {
//                int cnt = temp.get(s);
//                if (cnt >= 3) {
//                    if (!ans.contains(s)) {
//                        ans.add(s);
//                    }
//                }
//            }
//        }
//        return ans;
//    }

}
